#include <iostream>
#include <fstream>
#include <string>
#include "file_utilits.h"
#include "CImgWrapper.h"
#include "jpeg_mem_advance.h"
#include "j2k_mem_advance.h"
using namespace cimg_library;
using namespace std;

// 模板实例化，用于检查编译错误
template class CImgWrapper<uint8_t>;
typedef CImgWrapper<uint8_t> CImgWrapperUChar;

int main()
{
	try {
		// 输入和输出图像文件的路径
	 
		const char* input_jpg_file = "C:\\Code\\Jpeg2k_Cimg_Wrap\\images/he049.jpg";
		const char* output4_jpg_file = "C:\\Code\\Jpeg2k_Cimg_Wrap\\images/he049-out4.jp2";

		CImgWrapperUChar image_jpg;

		// 从输入文件加载JPEG二进制数据
		std::vector<uint8_t> jpeg_data = gdface::load_binary_file(input_jpg_file);

		// 读取JPEG头以获取图像矩阵的详细信息
		auto matrix = jwp_read_jpeg_header_mem(jpeg_data.data(), jpeg_data.size());
		cout << matrix.width << "x" << matrix.height << "x" << (uint32_t)matrix.channels << " color=" << matrix.color_space << endl;

		// 从内存加载JPEG图像，并自定义颜色空间转换（如果不注释）
		image_jpg.load_mem_jpeg(
			jpeg_data,
			[](j_common_ptr cinfo) {
				((j_decompress_ptr)cinfo)->out_color_space = JCS_GRAYSCALE;
			}
		);

		// 将JPEG图像加载到矩阵中，并提供自定义解压缩选项
		auto mat = load_jpeg_mem(jpeg_data.data(), jpeg_data.size(), [](j_common_ptr cinfo) {
			// 可以在这里设置自定义的解压缩选项
			});

		//// 显示加载的图像
		//cimg_library::image_matrix_display(mat, "test display", true);

		//// 将图像转换为灰度并显示
		//auto gray_mat = mat.to_gray();
		//cimg_library::image_matrix_display(gray_mat, "test to gray matrix", true);

		//// 将灰度图像保存为JPEG文件的二进制字符串
		//auto out_str = jwp_save_jpeg_gray_mem_as_string(mat);
		//gdface::save_binary_file(output3_jpg_file, out_str.c_str(), out_str.size());

		// 将图像保存为JPEG 2000格式
		auto output = save_j2k_mem(mat, 30, OPJ_CODEC_JP2);
		gdface::save_binary_file(output4_jpg_file, output.stream_data(), size_t(output.stream_length()));

		//// 在图像上绘制文本并显示
		//unsigned char purple[] = { 0, 0, 255 };
		//image_jpg.draw_text(100, 100, "Hello World", purple);
		//image_jpg.display("My first CImg code");

		//// 将修改后的图像保存为JPEG格式
		//image_jpg.save_jpeg(output2_jpg_file);

		//// 将当前图像作为内存中的压缩JPEG保存并写入输出文件
		//image_jpg.save_mem_jpeg([&](const uint8_t* img, size_t size) {
		//	std::ofstream ofs(output_jpg_file, std::ofstream::binary);
		//	ofs.write((const char*)img, size);
		//	printf("%s saved, size=%zd\n", output_jpg_file, size);
		//	ofs.close();
		//	}, 100, [](j_common_ptr com_ptr) {
		//		// 可以在这里设置额外的压缩选项
		//		});

		//	// 加载JPEG 2000数据并显示图像
		//	auto j2k_data = gdface::load_binary_file(output4_jpg_file);
		//	image_jpg.load_mem_j2k(j2k_data.data(), j2k_data.size(), FS_JPEG2K_CODEC_JP2);
		//	image_jpg.draw_text(100, 100, "jpeg2000 test", purple);
		//	image_jpg.display(output4_jpg_file);

		//	// 显示从JPEG 2000加载的图像
		//	auto j2k_mat = jwp_load_j2k_mem(j2k_data.data(), j2k_data.size(), FS_JPEG2K_CODEC_JP2);
		//	cimg_library::image_matrix_display(j2k_mat, "test jwp_load_j2k_mem display", true);

	}
	catch (exception& e) {
		cout << e.what() << endl;
	}

	return 0;
}
